﻿using BootstrapBlazor.Components;
using LibraryProject.Model;

namespace MauiProject.Tool;

public static class LinkFilePageTool {
    public static TreeItem SorTreeItem(List<LinkFile> linkFiles) {
        // 1. 将List<LinkFile>转换为List<TreeItem>
        var treeItems = ConvertListLinkFileToListTreeItem(linkFiles);
        // 2. 创建根节点
        var root = new TreeItem() {
            Id = "0",
            HasChildNode = true,
            Text = "root",
            ParentId = "-1",
            Icon = "fas fa-folder-minus"
        };
        // 3. 创建hashMap，key是TreeItem的id，value是TreeItem的childrenList（Items）
        var hashMap = new Dictionary<string, List<TreeItem>>(treeItems.Count) {
            { root.Id, new List<TreeItem>() }
        };
        foreach (var treeItem in treeItems) { // 将所有的treeItem放进hashMap
            if (treeItem.Id != null) {
                hashMap.Add(treeItem.Id, new List<TreeItem>());
            }
        }
        // 4. 遍历所有TreeItem，根据ParentId，将TreeItem放入对应的List<LinkFile>中
        // hashMap中保存的是TreeItem的childrenList，但是childrenList中的TreeItem没有childrenList的信息
        // 也就是只有一层信息
        foreach (var treeItem in treeItems) {
            if (treeItem.ParentId != null && hashMap.ContainsKey(treeItem.ParentId)) {
                hashMap[treeItem.ParentId].Add(treeItem);
            }
        }

        // 5. 组装root的childrenList
        root.Items = hashMap[root.Id];
        // 6. 调用递归
        AddChild(hashMap, root);

        return root;
    }

    private static void AddChild(Dictionary<string, List<TreeItem>> hashMap, TreeItem root) {
        for (var i = 0; i < root.Items.Count; i++) {
            if (root.Items[i].Id != null) {
                root.Items[i].Items = hashMap[root.Items[i].Id];
                AddChild(hashMap, root.Items[i]);
            }
        }
    }


    // 将List<LinkFile>转换为List<TreeItem>
    public static List<TreeItem> ConvertListLinkFileToListTreeItem(List<LinkFile> linkFiles) {
        var list = new List<TreeItem>();
        foreach (var t in linkFiles) {
            list.Add(ConvertLinkFileToTreeItem(t));
        }
        return list;
    }

    // 将数据库中读取的LinkFile转换为TreeItem
    public static TreeItem ConvertLinkFileToTreeItem(LinkFile linkFile) {
        var treeItem = new TreeItem() {
            Id = linkFile.Id.ToString(),
            HasChildNode = linkFile.IsDir == 1, // 是否有子节点，即是否是文件夹
            Text = linkFile.Name,
            ParentId = linkFile.ParentId.ToString(),
            Icon = (linkFile.IsDir == 1 ? "fas fa-folder-minus" : "fas fa-font-awesome"),
        };
        return treeItem;
    }
}